﻿#include"mainwindow.h"
#include<QFile>
#include<QDebug>
#include<QStringList>
#include<QMessageBox>
#include<QFileDialog>
#include<QTextStream>
#include<QUrl>
#include<QList>
#include<QMimeData>
#include<QObjectList>
#include<QMenu>
#include<QtPrintSupport/QPrinter>
#include<QFileDialog>

#include<QtPrintSupport/QPrintDialog>
#include<QtPrintSupport/QAbstractPrintDialog>
#include<QtPrintSupport/qabstractprintdialog.h>
#include<QtPrintSupport/qprintdialog.h>
#include<QFontDialog>
#include<QKeyEvent>
#include<QApplication>


int MainWindow::showQuoteMessage(QString msg)
{
    qDebug()<<__LINE__<<__FUNCSIG__<<__FILE__;

    QMessageBox box(this);
    box.setIcon(QMessageBox::Question);
    box.setText(msg);
    box.setStandardButtons(QMessageBox::Yes|QMessageBox::No|QMessageBox::Cancel); // 添加 是否。。或者取消


    return box.exec();


}

void MainWindow::changeFileStutus()
{
    qDebug()<<__LINE__<<__FUNCSIG__<<__FILE__;


}

QString MainWindow::saveCurrentData(QString path)
{
    qDebug()<<__LINE__<<__FUNCSIG__<<__FILE__;
    QString ret =path;
    if(ret=="")
    {
        ret=showFileDialog(QFileDialog::AcceptSave,"save");

    }

    if(ret!="")
    {
        QFile file(ret);

        // 打开文件成功
        if(file.open(QIODevice::WriteOnly|QIODevice::Text))
        {
            qDebug()<<"in line goto the file open "<<__LINE__;
            QTextStream out(&file);
            out<<m_edit.toPlainText();
            file.close();
            // 设置当前的标题是当枪的数据源
            QFileInfo info(ret);
            setWindowTitle(info.baseName());
            m_isTextChange = false;
            // 保存的数据就可以将 这个设置为false ;
        }
        else // 打开文件失败
        {
            showErrorMessage("save file"+m_file+"error");
            m_file="";
        }

    }

    return ret;
}

QAction *MainWindow::findMenuBarAction(QString text)
{
    QAction * ret = nullptr;
    const QObjectList& list = menuBar()->children();
    qDebug()<<"list.count() ="<<list.count() ;

       for(int i=0; i<list.count(); i++)
       {
           QMenu* menu = dynamic_cast<QMenu*>(list[i]);

           if( menu != nullptr )
           {
               QList<QAction*> actions = menu->actions();

               for(int j=0; j<actions.count(); j++)
               {
                   qDebug()<<"action["<<j<<"].text() = "<<actions[j]->text();
                   if( actions[j]->text().startsWith(text) )
                   {
                       ret = actions[j];
                       break;
                   }
               }
           }
       }
       qDebug()<<ret <<"  "<<text<<__FUNCSIG__;
    return ret;
}

QAction *MainWindow::findToolBarAction(QString text)
{
    QAction * ret = nullptr;
   const  QObjectList & list = children();
   qDebug()<<__FUNCSIG__<<"list.count() ="<<list.count() ;
    for( int i = 0 ; i< list.count() ; ++i)
    {
        QToolBar * bar = dynamic_cast<QToolBar*>(list[i]);
        if(bar!=nullptr)
        {
           QList<QAction *>action = bar->actions();
//           for( int j = 0 ; j< action.count(); ++j)
//           {
//               qDebug()<<"action["<<j<<"].toolTip() = "<<action[j]->toolTip();

//               if(action[i]->toolTip().startsWith("undo"))
//               {
//                   ret = action[j];
//                   qDebug()<<"goto";
//                   break;
//               }
//           }

           ret = action[13];
        }
    }
    qDebug()<<ret <<"  "<<text<<__FUNCSIG__;

    return ret;
}

void MainWindow::onFileOpen()
{
    qDebug()<<__LINE__<<__FUNCSIG__<<__FILE__;

    preEditChange();

    if(!m_isTextChange)
    {
        QString path = showFileDialog(QFileDialog::AcceptOpen,"open file");
        openFileToEdit(path);
    }


}


void MainWindow::onFileSave()
{
    qDebug()<<__LINE__<<__FUNCSIG__<<__FILE__;
    if(m_isTextChange)
    {
        QString path = saveCurrentData(m_file);
        if(path!="")
        {
            m_file= path;
            m_isTextChange = false;
        }
    }
}

void MainWindow::onFileSaveAs()
{
    qDebug()<<"call on FIleSAveAS";
    QString path = saveCurrentData("");
    if(path!="")
    {
        m_file= path;
    }
}

void MainWindow::onFileNew()
{
    qDebug()<<__LINE__<<__FUNCSIG__<<__FILE__;

    if(m_isTextChange) //判断是否要保存文件
    {
        int ret =showQuoteMessage("Do you want to save the file?");
        switch (ret) {
        case QMessageBox::Yes:
        {
            qDebug()<<__LINE__<<__FUNCSIG__<<__FILE__;
            saveCurrentData(m_file);
            m_file = "";
            m_isTextChange = false;
            m_edit.clear();
            setWindowTitle("* new file");

        } break;
        case QMessageBox::No:
        {
            ;
            m_edit.clear();
            setWindowTitle("New * File");

        }break;
        case QMessageBox::Cancel:
        {
            return ; // 取消就什么也不做，，，直接退出openFile

        } break;
        default:
            break;
        }
    }
    else
    {
        m_edit.clear();
        m_isTextChange=false;
        m_file="";
        setWindowTitle("* new File");
    }

}

void MainWindow::onTextChange()
{
    qDebug()<<__LINE__<<__FUNCSIG__<<__FILE__;
    m_isTextChange = true;
    QString text = m_edit.toPlainText();
    int wd =text.size();
    m_word.setText("word : "+QString::number(wd));
}

void MainWindow::cursorChange()
{
    // qDebug()<<__LINE__<<__FUNCSIG__<<__FILE__;
    m_sbChange = true;

}

void MainWindow::openFileToEdit(QString path)
{
    if(path!="")
    {
        QFile file(path);


        if(file.open(QIODevice::ReadOnly|QIODevice::Text))
        {
            m_file = path; // 如果打开文件成功 给文件路径赋值
            QTextStream out(&file);
            QFileInfo info(path);
            // 将文件的内容送到m_edit;
            m_edit.setPlainText( out.readAll());

            setWindowTitle(info.baseName()); // 设置notePad 的标题是 打开文件的名字
            m_isTextChange = false; // 设置 文件的状态是没有改动的
            file.close();

        }
    }
}

void MainWindow::preEditChange()
{
    qDebug()<<__LINE__<<__FUNCSIG__<<__FILE__;

    if(m_isTextChange)
    {
        int ret =showQuoteMessage("Do you want to save file ?");
        switch(ret)
        {
        case QMessageBox::Yes:
        {
            qDebug()<<__LINE__;
            saveCurrentData(m_file);

        } break;
        case QMessageBox::No :{
            m_isTextChange = false;
        } break;
        case QMessageBox::Cancel:{
            break;
        }

        default:
            break;

        }
    }
}

void MainWindow::closeEvent(QCloseEvent *e)
{
    qDebug()<<__LINE__<<__FUNCSIG__<<__FILE__;

    preEditChange();

    if(! m_isTextChange)
    {
        QMainWindow::closeEvent(e); // 父类的close
    }
    else
    {
        e->ignore();
    }
}

void MainWindow::onCopyAvailable(bool available)
{
   // findMenuBarAction("copy")->setEnabled(available);
     // findMenuBarAction("cut")->setEnabled(available);
   qDebug()<<__FUNCSIG__;
      // findToolBarAction("copy")->setEnabled(available);
      // findToolBarAction("cut")->setEnabled(available);
}

void MainWindow::onUndoAvailable(bool re)
{
   QAction *rx= findMenuBarAction("undo");

   if(rx){
       rx->setEnabled(re);
   } else{
       qDebug()<<"nullptr"<<__LINE__;
   }
   ;
    findToolBarAction("undo")->setEnabled(re);
}



void MainWindow::onRedoAvailable(bool re)
{
    //findMenuBarAction("redo")-
}

void MainWindow::onFilePrint()
{
    qDebug()<<"OnFilePrit()";
    QPrintDialog dlg(this);
  dlg.setWindowTitle("print");

   if(dlg.exec() == QPrintDialog::Accepted)
    {
        QPrinter *p = dlg.printer();
       // m_edit.document()->print(p);
   }
}

void MainWindow::onFontChange()
{
    qDebug()<<"onFontChange()";

    QFontDialog dlg(this);

    if(dlg.exec() ==QFontDialog::Accepted)
    {
        QFont font=dlg.selectedFont();
        m_edit.setFont(font);
    }

}

void MainWindow::onCursorPositionChange()
{
    qDebug()<<"onCursorPostionChange()";

    int pos = m_edit.textCursor().position(); // 获取光标的位置
    QString text = m_edit.toPlainText();

    int col = 0 ;
    int ln = 1 ;
    int flag = -1;

    for( int i = 0 ; i< pos; i++)
    {

        if(text[i]=='\n')
        {
            ln++;
            flag = i;
        }
    }

    flag++ ;
    col = pos -flag;

    m_label.setText("ln : "+QString::number(ln)+"    col : "+QString::number(col+1));
}

void MainWindow::onEditDelete()
{
    qDebug()<<"delete something";

    QKeyEvent keyPress (QEvent::KeyPress,Qt::Key_Delete,Qt::NoModifier); // 单纯按下一个按键， 不包括功能键

    QKeyEvent keyRelea (QEvent::KeyRelease,Qt::Key_Delete,Qt::NoModifier);

    QApplication::sendEvent(&m_edit,&keyPress);
    QApplication::sendEvent(&m_edit,&keyRelea);
}

void MainWindow::onFileExit()
{
    close();
}

void MainWindow::onFindEdit()
{
    qDebug()<<__FUNCSIG__;
    if(m_pFindDlg.get()!=nullptr)
    {
        qDebug()<<"Hello";
         m_pFindDlg->show();
    }

}

void MainWindow::onStatusVisual()
{
    auto sb= statusBar();
    bool visual=sb->isVisible();
    sb->setVisible(!visual);

}

void MainWindow::dragEnterEvent(QDragEnterEvent *e)
{
    qDebug()<<__LINE__<<__FUNCSIG__<<__FILE__;
    if(e->mimeData()->hasUrls())
    {
        e->acceptProposedAction();
    }
    else{
        e->ignore();
    }
}

/*void MainWindow::dragEnterEvent(QDragEnterEvent *e)
{
    qDebug()<<__LINE__<<__FUNCSIG__<<__FILE__;
    qDebug()<<acceptDrops();
    if(e->mimeData()->hasUrls())
    {
        e->acceptProposedAction();
        preEditChange();
        if(!m_isTextChange)
        {
            QList<QUrl>list= e->mimeData()->urls();
            QString path=list[0].toLocalFile();

            QFileInfo info(path);

            if(info.isFile())
            {
                openFileToEdit(path);
            }
            else
            {
                showErrorMessage("can not open the dir");
            }

        }
    }
    else
    {
        e->ignore();
    }
}
*/
void MainWindow::dropEvent(QDropEvent *e)
{
    qDebug()<<__LINE__<<__FUNCSIG__<<__FILE__;
  //  qDebug()<<acceptDrops();
    if(e->mimeData()->hasUrls())
    {
      //  e->acceptProposedAction();
        preEditChange();
        if(!m_isTextChange)
        {
            QList<QUrl>list= e->mimeData()->urls();
            QString path=list[0].toLocalFile();

            QFileInfo info(path);
            setWindowTitle(info.fileName());
            qDebug()<<info.fileName()<<" ----------------------                       ----------------- ";
            if(info.isFile())
            {
                openFileToEdit(path);
            }
            else
            {
                showErrorMessage("can not open the dir");
            }

        }
    }
    else
    {
        e->ignore();
    }
}




QString MainWindow::showFileDialog(QFileDialog::AcceptMode mode,QString title)
{
    qDebug()<<__LINE__<<__FUNCSIG__<<__FILE__;

    QString ret ="";
    QFileDialog fg(this);

    QStringList filters;
    // 文本过滤器
    filters.append("Text File(*.txt)");
    filters.append("All File (*.*)");
    fg.setNameFilters(filters); //设置文本过滤

    fg.setWindowTitle(title);
    fg.setAcceptMode(mode); // 以打开的模式打开文件对话框
    if(mode == QFileDialog::AcceptOpen)
    {
        fg.setFileMode(QFileDialog::ExistingFiles); //只读已经存在的
    }

    if(fg.exec() ==QFileDialog::Accepted)
    {
        ret = fg.selectedFiles()[0];
    }

    return ret;
}

void MainWindow::showErrorMessage(QString msg)
{
    qDebug()<<__LINE__<<__FUNCSIG__<<__FILE__;

    QMessageBox box(this);
    box.setIcon(QMessageBox::Critical);
    box.setText(msg);
    box.exec();
}
